package org.huawei260.TiKu.B;

/**
 * @Auther: qingle
 * @Date: 2024/10/27-21:24
 * @Description:
 *
 * 存在一种虚拟IPv4地址，由4小节组成，除了第一小节的范围是1-128以外，其余三节的范围为0-255，以#号间隔，
 *
 *                 格式如下： (1~128)#(0~255)#(0~255)#(0~255)
 *
 *                 例如：
 *
 *                 128#0#255#255，转换为32位整数的结果为2147549183（0x8000ffff）
 *
 *                 1#0#0#0，转换为32位整数的结果为16777216（0x01000000）
 *
 *                 请利用这个特性把虚拟IPv4地址转换为一个32位的整数，IPv4地址以字符串形式给出，
 *
 *                 要求每个IPvV4地址只能对应到唯一的整数上。 如果是非法IPv4，输出字符串"invalid IP"。
 *
 *   要求每个IPvV4地址只能对应到唯一的整数上。 如果是非法IPv4，输出字符串"invalid IP"。
 *
 * 输入格式
 *                 输入一行，虚拟IPv4地址格式字符串
 * 输出格式
 *
 * 		输出一行，按照要求输出整型或者特定字符
 *
 * 输入样例    复制
 * 100#101#1#5
 * 输出样例    复制
 * 1684340997
 *
 * @version: 1.0
 */
public class B_2508_IPv4地址转换成整数 {
//	public class VirtualIPv4ToInt {
		public static void main(String[] args) {
			// 测试示例
			System.out.println(virtualIPv4ToInt("128#0#255#255"));  // 应输出 2147549183
			System.out.println(virtualIPv4ToInt("1#0#0#0"));        // 应输出 16777216
			System.out.println(virtualIPv4ToInt("129#0#0#0"));      // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#256#0#0"));      // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#0#0#256"));     // 应输出 "invalid IP"
			System.out.println(virtualIPv4ToInt("1#0#0"));         // 应输出 "invalid IP"
		}

		/**
		 * 将虚拟IPv4地址转换为32位整数
		 *
		 * @param ipStr 虚拟IPv4地址字符串
		 * @return 转换后的32位整数，如果输入无效则返回 "invalid IP"
		 */
		public static String virtualIPv4ToInt(String ipStr) {
			// 使用正则表达式分割字符串，确保格式正确
			String[] parts = ipStr.split("#");

			// 验证格式是否正确
			if (parts.length != 4) {
				return "invalid IP";
			}

			long result = 0;
			try {
				for (int i = 0; i < parts.length; i++) {
					int part = Integer.parseInt(parts[i]);
					if (i == 0 && (part < 1 || part > 128)) {
						return "invalid IP";
					} else if (i > 0 && (part < 0 || part > 255)) {
						return "invalid IP";
					}
					if (i == 0) {
						result |= ((long) part) << 24;
					} else if (i == 1) {
						result |= ((long) part) << 16;
					} else if (i == 2) {
						result |= ((long) part) << 8;
					} else {
						result |= part;
					}
				}
			} catch (NumberFormatException e) {
			}
			return "invalid IP";
		}

}
